package src.A_JavaBase;

public class Oop01{
    /*
    面向过程思想，步骤清晰简单，第一步做什么，第二部做什么。。。适合处理一些较为简单的问题

    从宏观整体的上我们需要使用 面向对象思路 ,但是具体到围观操作仍然需要 面向过程思路 去处理

    面向对象编程（Object-Oriented Programming，OOP）
    OOP本质：以类的方式组织代码，以对象的组织（封装）数据
    核心思想：1、抽象；2、三大特性：封装，继承，多态

    ps：抽象，其实说白了，抽象就是把事物的共同特征总结为一点。 他和具体又是相对的。就比如说“男人”对于“人类”是具体的，而“动物”对于“人类”又是抽象的。抽象---》抽出相同特征的对象，他也有个同义词叫归类。
        封装，秉承高内聚低耦合设计理念，属性私有 get/set
        继承，extends，只有单继承，没有多继承，is-a的关系
            1.“is-a”是继承的关系,比如人是动物,人和动物是继承的关系;
            2.“has-a”是聚合的关系,比如人有眼睛,人和眼睛是聚合的关系;
            也可以理解为 is-a 是“继承”，但has-a是“接口”关系。是“相互依赖”的关系，同时它们的生命周期都是一样的。
        多态，多态的存在条件为：1、有继承关系；2、子类重写父类的方法；3、父类引用指向子类对象
            通过 static(属于类，不属于实例)，final(常量)，private(私有) 修饰的方法不能被重写！
            ps：Java程序中，所有对象都有两种类型：编译时类型 和 运行时类型，例如：Object object = new String("hello"); 编译时是Object类型，而运行时是Strig类型
                这也是多态的体现，如果运行时想用object里的方法，这时候就要用到反射了

    从认识论角度考虑是先有对象后有类。对象，是具体的实物。类，是抽象的，是对对象的抽象
    从代码运行的角度考虑是先有类后有对象，类是对象的模板

    因为类是抽象的，通过new关键字实例化，类里面只能写 属性 和 方法
    java类的初始化顺序为：父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块
                      > 父类成员变量 > 父类构造代码块 > 父类构造器 > 子类成员变量 > 子类构造代码块 > 子类构造器

                      注：如果静态属性有 final 修饰时，则不会加载，当成常量使用。
                      例：public static final int a =123;
                      但是如果上面的等式右值改成表达式(且该表达式在编译时不能确定其值)时则会加载类。
                      例：public static final int a = math.PI

    String 和 八大基本数据类型的包装类 都默认用final关键字修饰，属于常量存放在常量池中，包装类记得了解 装箱 和 拆箱 的含义
    */
    public static void main(String[] args) {
        Oop1Monkey monkey = new Oop1Monkey();
        Oop1Animal animal = new Oop1Monkey(); // 父类的引用指向子类的类型
        System.out.println();
        // 注意静态重写和非静态重写的区别（ps：静态方法在类加载时已经加载，所以它只跟引用类有关，和谁实现的无关）
        monkey.cx1();
        animal.cx1();
        monkey.cx2();
        animal.cx2();
        System.out.println();
        // 能调用自己的和继承父类的方法
        monkey.zty();
        monkey.fty();
        // 能调用自己的不能用子类特有的方法
        animal.fty();
        //animal.zty();  // 会报错，父类指向子类不能调取子类特有的方法，可以强转为子类然后调取
        System.out.println(animal instanceof Oop1Monkey);
    }
}
